#ifndef V4L2_H
#define V4L2_H

//GNU C библиотека.
#include <linux/videodev.h>


//Библиотека Qt.
#include <QTime>


//Внутренняя библиотека.
#include "viddevice.h"


//Объявление внешних классов.
class VidFrame;
class QTimer;


class V4L2 : public VidDevice
{
	Q_OBJECT
public:
	//Конструктор.
	V4L2(QString fname, int index, QObject *parent = NULL);

	//Деструктор.
	virtual ~V4L2();

	//Функция возврата типа устройства.
	virtual VidDevice::DEVTYPE getType() {return VidDevice::VIDEO4LINUX2;}

	//Функция возврата списка значений параметра устройства.
	virtual bool getListParam(DevParam::GET_LIST_PARAM param, QHash<int, QVariant> *valhash);

	//Функция возврата параметра устройства.
	virtual bool getParam(DevParam::GET_PARAM param, QVariant *value);

public slots:
	//Слот установки параметра устройства.
	virtual void slotSetParam(DevParam::SET_PARAM param, int value);

	//Слот установки параметра устройства.
	virtual void slotSetParam(DevParam::SET_PARAM param, bool value);

protected:
	//Функция открытия устройства.
	virtual bool openDevice();

	//Функция открытия устройства.
	virtual bool openDevice(QString fname);

	//Функция закрытия устройства.
	virtual void closeDevice();

	//Функция запуска видеозахвата.
	virtual bool startCapturing();

	//Функция остановки видеозахвата.
	virtual bool stopCapturing();

private:
	enum STATE {UNACTIVE, ACTIVE, CAPTURING};

	//Состояние устройства.
	STATE devState;

	//Наименование файла устройства.
	QString devFName;

	//Дескриптор файла устройства.
	int devFDesc;

	//Видеоформат.
	int v4l2PixFmt;
	int width, height;

	//Кадровый период.
	int maxFramerate, framerate;
	QTime framerateTime;

	//Счётчики видеокадров для memory mapping'а.
	int maxNumBuffers, numBuffers, qBufIndex, dqBufIndex;

	//Видеокадры.
	VidFrame *frames[VIDEO_MAX_FRAME];

	//Видеотаймер.
	QTimer *vidTimer;

	//Функция возврата наименования устройства.
	QString getDevName();

	//Функция возврата наименования драйвера устройства.
	QString getDriverName();

	//Функция возврата списка видеовходов.
	void enumInputs(QHash<int, QVariant> *inputshash);

	//Функция установки видеовхода по индексу текущим.
	bool setInput(int index);

	//Функция возврата индекса текущего видеовхода.
	bool getInput(int *index);

	//Функция возврата списка видеостандартов.
	void enumStandards(QHash<int, QVariant> *standardshash);

	//Функция установки видеостандарта по индексу текущим.
	bool setStandard(int index);

	//Функция возврата индекса текущего видеостандарта.
	bool getStandard(int *index);

	//Функция возврата списка видеоформатов.
	void enumPixFormats(QHash<int, QVariant> *formatshash);

	//Функция установки видеоформата.
	bool setPixFormat(int index);

	//Функция возврата индекса текущего видеоформата.
	bool getPixFormat(int *index);

	//Функция возврата списка видеоразрешений.
	void enumResolutions(QHash<int, QVariant> *reshash);

	//Функция установки видеоразрешения.
	bool setResolution(int index);

	//Функция возврата видеоразрешения.
	bool getResolution(int *index);

	//Функция возврата информации о градации яркостной и/или цветовой настройки.
	bool getLightRange(int id, int *min, int *max, int *step, int *value);

	//Функция установки нового значения яркостной и/или цветовой настройки.
	bool setLightValue(int id, int value);

	//Функция выделения памяти под видеобуфер.
	bool memMap(int index, int length, int offset);

	//Функция освобождения памяти.
	void memUnmap();

private slots:
	//Слот сработки видеотаймера.
	void slotVidTimerTimeout();

};

#endif
